package 多线程;
/*
守护线程
Java程序入口就是由JVM启动main线程，main线程又可以启动其他线程。当所有线程都运行结束时，JVM退出，进程结束。

如果有一个线程没有退出，JVM进程就不会退出。所以，必须保证所有线程都能及时结束。

但是有一种线程的目的就是无限循环，例如，一个定时触发任务的线程：

class TimerThread extends Thread {
    @Override
    public void run() {
        while (true) {
            System.out.println(LocalTime.now());
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                break;
            }
        }
    }
}
如果这个线程不结束，JVM进程就无法结束。问题是，由谁负责结束这个线程？

然而这类线程经常没有负责人来负责结束它们。但是，当其他线程结束时，JVM进程又必须要结束，怎么办？

答案是使用守护线程（Daemon Thread）。

守护线程是指为其他线程服务的线程。在JVM中，所有非守护线程都执行完毕后，无论有没有守护线程，虚拟机都会自动退出。

因此，JVM退出时，不必关心守护线程是否已结束。

如何创建守护线程呢？方法和普通线程一样，只是在调用start()方法前，调用setDaemon(true)把该线程标记为守护线程：

Thread t = new MyThread();
t.setDaemon(true);
t.start();
在守护线程中，编写代码要注意：守护线程不能持有任何需要关闭的资源，例如打开文件等，因为虚拟机退出时，守护线程没有任何机会来关闭文件，这会导致数据丢失。

小结
守护线程是为其他线程服务的线程；

所有非守护线程都执行完毕后，虚拟机退出；

守护线程不能持有需要关闭的资源（如打开文件等）。
*/
/*
守护线程的JDK官方文档，意思是：
‎	•当运行的唯一线程都是守护程序线程时，Java 虚拟机将退出。‎
‎	•当JVM 中不存在任何一个正在运行的非守护线程时，则 JVM 进程即会退出。
*/
public class 守护线程 {
	public static void main(String[] arg0) {
		System.out.println("main start=====");
		Thread thread1 = new Thread("守护线程") {
			@Override
			public void run() {
				int i = 0;
				while (i <= 100) {//正常情况可以运行99次，但当用户线程全部结束，该守护线程立即结束。
					i++;
					try {
						Thread.sleep(500);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println(Thread.currentThread().getName() + "：" + i);
				}
				//super.run();
			}
		};

		Thread thread2 = new Thread("用户线程") {
			@Override
			public void run() {
				int i = 0;
				while (i <= 4) {
					i++;
					try {
						Thread.sleep(500);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println(Thread.currentThread().getName() + "：" + i);
				}
				//super.run();
			}
		};

		// setDaemon, 不设置则默认false
		thread1.setDaemon(true);// 设置thread1为守护线程
		thread2.setDaemon(false);// 设置thread2为普通线程

		thread1.start();
		thread2.start();
		System.out.println("main end==");
	}
}
/*
执行结果：

main start=====
main end==
用户线程：1
守护线程：1
守护线程：2
用户线程：2
守护线程：3
用户线程：3

从运行结果可以看出：守护线程可以运行99次，但普通线程结束，守护线程立即结束，尽管没有运行99次。
	1.主线程，main执行结束后，普通线程可以继续执行直至执行完毕；
	2.用户线程执行完毕后，守护线程立刻结束；
	3.守护线程先结束，不影响用户线程运行；
【结论】
	-守护线程类似于整个进程的一个默默无闻的小喽喽；它的生死无关重要，它却依赖整个进程而运行；哪天其他线程结束了，没有要执行的了，程序就结束了，理都没理守护线程，
		就把它中断了；
	-如果守护线程自己识时务，自己早点执行完毕，那就自己早点结束；整个程序也不必因此而挽留它；
	-守护线程就是一个暗恋女神的备胎
	-注意： 由于守护线程的终止是自身无法控制的，因此千万不要把IO、File等重要操作逻辑分配给它；因为它不靠谱；

那么守护线程的作用是什么？
	举例，GC垃圾回收线程：就是一个经典的守护线程，当我们的程序中不再有任何运行的Thread,程序就不会再产生垃圾，垃圾回收器也就无事可做，所以当垃圾回收线程
	是JVM上仅剩的线程时，垃圾回收线程会自动离开。它始终在低级别的状态中运行，用于实时监控和管理系统中的可回收资源。
应用场景：
	（1）来为其它线程提供服务支持的情况；
	（2）或者在任何情况下，程序结束时，这个线程必须正常且立刻关闭，就可以作为守护线程来使用；反之，如果一个正在执行某个操作的线程必须要正确地关闭掉否则就
	会出现不好的后果的话，那么这个线程就不能是守护线程，而是用户线程。通常都是些关键的事务，比方说，数据库录入或者更新，这些操作都是不能中断的。
*/